﻿using System;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Web;
using InstaSharp.Models;
using Newtonsoft.Json.Linq;

namespace BlogsAPI.GeoLocation
{
    public class GeoYandex : IGeoCoder
    {
        /// <summary>
        /// Получение координат по адресу
        /// </summary>
        /// <param name="address">текстовое описание места</param>
        /// <returns>Координаты</returns>
        public  Location GetCoordsFromAddress(string address, CultureInfo lang = null, string specialApiKey = null)
        {
            Location loc = null;
            //http://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская+улица,+дом+7
            try
            {
                if (lang == null)
                {
                    lang = new CultureInfo("ru-RU");
                }
                /////////////////////////////
                string requesturl = String.Format(
                        "https://geocode-maps.yandex.ru/1.x/?format=json&lang={1}&geocode={0}",
    HttpUtility.UrlEncode(address), lang.Name);
                string reply = HttpClientOld.GET(requesturl);
                var data = JObject.Parse(reply);
                var geo = data["response"]["GeoObjectCollection"]["featureMember"][0]["GeoObject"]["Point"]["pos"]
                    .Value<string>();
                loc = new Location
                {
                    //У Яндекса широта и долгота изменены местами 
                    Latitude = decimal.Parse(geo.Split(' ')[1], CultureInfo.InvariantCulture.NumberFormat),
                    Longitude = decimal.Parse(geo.Split(' ')[0], CultureInfo.InvariantCulture.NumberFormat),
                    Name = address
                };
            }
            catch (Exception e2)
            {
                //плохо, очень плохо
                Debug.WriteLine(e2.Message);
            }
            return loc;
        }

        /// <summary>
        /// Получение имени города по координатам
        /// </summary>
        /// <param name="lat">широта</param>
        /// <param name="lng">долгота</param>
        /// <param name="lang">язык результата</param>
        /// <returns>Имя города</returns>
        public GeoResult GetCityFromCoords(double lat, double lng, CultureInfo lang = null, string specialApiKey = null)
        {
            GeoResult res = new GeoResult();
            //http://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская+улица,+дом+7
            try
            {
                if (lang == null)
                {
                    lang = new CultureInfo("ru-RU");
                }
                /////////////////////////////
                string requesturl = String.Format(new CultureInfo("en-US"),
                        "https://geocode-maps.yandex.ru/1.x/?kind=locality&format=json&lang={2}&geocode={1} {0}",
   lat, lng, lang.Name);//ВАЖНО - в запросе широта и долгота должны быть в порядке (долгота, широта).
                string reply = HttpClientOld.GET(requesturl);
                var data = JObject.Parse(reply);
                res.City = data.SelectTokens("..LocalityName").Select(s => s.Value<string>()).FirstOrDefault();
                res.CountryCode = data.SelectTokens("..CountryNameCode").Select(s => s.Value<string>()).FirstOrDefault();
            }
            catch (Exception e2)
            {
                //плохо, очень плохо
                Debug.WriteLine(e2.Message);
            }
            return res;
        }
    }
}
